package in.rob.client;
import in.lib.Debug;
import in.lib.exception.ExceptionHandler;
import in.lib.manager.APIManager;
import in.lib.manager.CacheManager;
import in.lib.manager.SettingsManager;
import in.lib.manager.UserManager;
import in.lib.utils.BitmapUtils;
import in.model.User;
import in.rob.client.dialog.NewPostDialog;
import in.rob.client.page.GeneralSettingsPage;
import lombok.Getter;
import net.callumtaylor.asynchttp.AsyncHttpClient;
import net.callumtaylor.asynchttp.response.JsonResponseHandler;
import android.app.Application;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.provider.Settings.Secure;
import android.support.v4.app.NotificationCompat;
import android.text.TextUtils;
import android.widget.ImageView;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.nostra13.universalimageloader.cache.disc.naming.FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.LRULimitedMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.DisplayImageOptions.Builder;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.LoadedFrom;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
public class MainApplication extends Application
{
public static enum ApplicationType
{
DEBUG,
BETA,
PLAY_STORE,
CD_KEY;
}
@Getter private static boolean onWifi = false;
@Getter private static boolean onMobile = false;
@Getter private static boolean hasConnection = false;
@Getter private ApplicationType applicationType = ApplicationType.DEBUG;
@Getter private ImageFader avatarFader;
@Getter private static DisplayImageOptions avatarImageOptions, mediaImageOptions, inlineMediaImageOptions, centerPostMediaOptions, threadAvatarImageOptions;
@Override public void onCreate()
{
super.onCreate();
ExceptionHandler.getInstance().register(this, getString(R.string.report_url));
CacheManager.getInstance().setCachePath(getFilesDir().getAbsolutePath());
int allocated = (int)(Runtime.getRuntime().maxMemory() / 4);
int allocatedMB = (int)(allocated / 1024.0 / 1024.0);
SettingsManager.setAllocatedMemory(allocatedMB);
Debug.out("Setting max memory: " + allocatedMB + " out of " + (Runtime.getRuntime().maxMemory() / 1024 / 1024));
try
{
applicationType = ((getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0) ? ApplicationType.DEBUG : applicationType;
Signature[] sigs = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES).signatures;
for (Signature s : sigs)
{
if (("" + s.hashCode()).equals(getString(R.string.play_cert)))
{
applicationType = ApplicationType.PLAY_STORE;
}
if (("" + s.hashCode()).equals(getString(R.string.debug_cert)) || ("" + s.hashCode()).equals(getString(R.string.beta_cert)))
{
applicationType = ApplicationType.BETA;
}
if (("" + s.hashCode()).equals(getString(R.string.cd_cert)))
{
applicationType = ApplicationType.CD_KEY;
}
}
}
catch (Exception e)
{
Debug.out(e);
}
Debug.setDebugMode(applicationType == ApplicationType.DEBUG || applicationType == ApplicationType.BETA);
if (applicationType == applicationType.BETA || applicationType == ApplicationType.DEBUG)
{
ExceptionHandler.getInstance().register(this, getString(R.string.beta_report_url));
}
ConnectivityManager connManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobile = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
onWifi = wifi != null && wifi.isConnected();
onMobile = mobile != null && mobile.isConnected();
hasConnection = onWifi || onMobile;
SettingsManager.getInstance(this);
initApplication();
}
public boolean isConnected()
{
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting())
{
return true;
}
return false;
}
public void initApplication()
{
UserManager.loadUser(getApplicationContext());
initConfiguration();
initImageLoader();
initQuickPost();
}
public void initConfiguration()
{
AsyncHttpClient client = new AsyncHttpClient(APIManager.API_URL + APIManager.API_STREAM + APIManager.API_VERSION);
client.get(APIManager.API_CONFIGURATION, new JsonResponseHandler()
{
@Override public void onSuccess()
{
JsonElement resp = getContent();
if (resp != null)
{
resp = resp.getAsJsonObject().get("data");
JsonObject text = resp.getAsJsonObject().get("text").getAsJsonObject().get("uri_template_length").getAsJsonObject();
JsonObject user = resp.getAsJsonObject().get("user").getAsJsonObject();
JsonObject post = resp.getAsJsonObject().get("post").getAsJsonObject();
JsonObject message = resp.getAsJsonObject().get("message").getAsJsonObject();
SettingsManager m = SettingsManager.getInstance();
m.setPostIdLength(text.get("post_id").getAsInt() + 3);
m.setMessageIdLength(text.get("message_id").getAsInt() + 3);
m.setPostLength(post.get("text_max_length").getAsInt());
m.setMessageLength(message.get("text_max_length").getAsInt());
m.setBioLength(user.get("text_max_length").getAsInt());
}
}
});
}
public void initQuickPost()
{
if (SettingsManager.isQuickPostEnabled() && UserManager.isLoggedIn())
{
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder notification = new NotificationCompat.Builder(this);
notification.setAutoCancel(false);
notification.setSmallIcon(R.drawable.quickpost_icon);
notification.setContentText(getString(R.string.tap_to_compose));
notification.setContentTitle(getString(R.string.notification_new_post));
Intent newPostIntent = new Intent(this, NewPostDialog.class);
newPostIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
PendingIntent contentIntent = PendingIntent.getActivity(this, (int)(System.currentTimeMillis() / 1000), newPostIntent, PendingIntent.FLAG_UPDATE_CURRENT);
notification.setContentIntent(contentIntent);
notification.setOngoing(true);
Bitmap b = User.loadAvatar(this, UserManager.getUserId());
if (b != null)
{
int width = getResources().getDimensionPixelSize(R.dimen.notification_large_icon_width);
int height = getResources().getDimensionPixelSize(R.dimen.notification_large_icon_height);
b = BitmapUtils.resize(b, width, height);
notification.setLargeIcon(b);
}
Notification not = notification.build();
notificationManager.notify(GeneralSettingsPage.QUICK_POST_ID, not);
}
}
public String getDeviceId()
{
// Create re-hashable password for the device
String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
deviceId = deviceId == null ? "NOID" + System.currentTimeMillis() : deviceId;
// Now we hash it and b64 it
String deviceHash = CacheManager.getHash(deviceId);
return deviceHash.trim();
}
public void initImageLoader()
{
avatarFader = new ImageFader(400);
ImageLoader coverImageLoader = ImageLoader.getInstance();
ImageLoaderConfiguration.Builder builder = new ImageLoaderConfiguration.Builder(getApplicationContext())
.threadPoolSize(1)
.discCacheFileNameGenerator(new FileNameGenerator()
{
@Override public String generate(String imageUri)
{
Uri uri = Uri.parse(imageUri);
if (!TextUtils.isEmpty(uri.getQueryParameter("avatar")))
{
return "avatar_" + uri.getQueryParameter("id") + "_" + String.valueOf(imageUri.hashCode());
}
return String.valueOf(imageUri.hashCode());
}
})
.denyCacheImageMultipleSizesInMemory()
.tasksProcessingOrder(QueueProcessingType.LIFO)
.memoryCache(new LRULimitedMemoryCache(Math.min(Math.max(SettingsManager.getAllocatedMemory() / 2, 4), 16) * 1024 * 1024))
.discCacheSize(1024 * 1024 * SettingsManager.getMaxImageCacheSize());
if (android.os.Build.VERSION.SDK_INT >= 11)
{
// builder.taskExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
// .taskExecutorForCachedImages(AsyncTask.THREAD_POOL_EXECUTOR);
}
ImageLoaderConfiguration config = builder.build();
coverImageLoader.init(config);
Builder avatarImageOptionsBuilder = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisc(true)
.displayer(avatarFader)
.bitmapConfig(Config.RGB_565)
.showImageOnLoading(R.drawable.default_avatar)
.showImageForEmptyUri(R.drawable.default_avatar)
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
.resetViewBeforeLoading(true);
Builder threadAvatarImageOptionsBuilder = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisc(true)
.bitmapConfig(Config.RGB_565)
.showImageOnLoading(R.drawable.default_avatar)
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
.resetViewBeforeLoading(true)
.showImageForEmptyUri(R.drawable.default_avatar);
Builder mediaImageOptionsBuilder = new DisplayImageOptions.Builder()
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
.bitmapConfig(Config.RGB_565)
.resetViewBeforeLoading(true);
Builder inlineMediaImageOptionsBuilder = new DisplayImageOptions.Builder()
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
.bitmapConfig(Config.RGB_565)
.resetViewBeforeLoading(true)
.cacheInMemory(true);
Builder centerPostMediaOptionsBuilder = new DisplayImageOptions.Builder()
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
.bitmapConfig(Config.RGB_565)
.cacheInMemory(true);
if (SettingsManager.getAllocatedMemory() <= 8)
{
inlineMediaImageOptionsBuilder.cacheInMemory(false);
centerPostMediaOptionsBuilder.cacheInMemory(false);
}
avatarImageOptions = avatarImageOptionsBuilder.build();
threadAvatarImageOptions = threadAvatarImageOptionsBuilder.build();
mediaImageOptions = mediaImageOptionsBuilder.build();
inlineMediaImageOptions = inlineMediaImageOptionsBuilder.build();
centerPostMediaOptions = centerPostMediaOptionsBuilder.build();
}
@Override public void onLowMemory()
{
ImageLoader.getInstance().clearMemoryCache();
super.onLowMemory();
}
public static class ImageFader extends FadeInBitmapDisplayer
{
public ImageFader(int delay)
{
super(delay);
}
@Override public Bitmap display(Bitmap bitmap, ImageView imageView, LoadedFrom loadedFrom)
{
if (loadedFrom != LoadedFrom.MEMORY_CACHE)
{
return super.display(bitmap, imageView, loadedFrom);
}
else
{
imageView.setImageBitmap(bitmap);
return bitmap;
}
}
}
}